# -*- coding: latin-1 -*-
'''
Created on 18/10/2010

@author: nmedina
'''
import win32print
import win32api
import os, sys
import string
from reportlab.pdfgen import canvas
import reportlab
from reportlab.lib.pagesizes import letter, A4
from reportlab.lib.units import inch , cm
from reportlab.graphics.charts.textlabels import Label
from reportlab.platypus import Table , TableStyle
from reportlab.lib.colors import navy, yellow, red ,green,white,black
import sys
from wx.lib.embeddedimage import PyEmbeddedImage
import random
osplad64x64 = PyEmbeddedImage(
    "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"
    "vWlqKxW2Zs2acrkQLejtDYiwY8eOtWvXAgvL3q+nX3EQII8fjT/wu/jw1zkmtGuZxcqkw791"
    "FU5eH7zkLNRq2tUCSjIglQDgWw1buNMLKVNG4jd24XNfGH1oS80DGUj0QddmTh5e/brXmaCW"
    "5fAcCALIQnKdW+aIgDvS+gfmmq88/+U/vP76NWvWbHtk54knnnjvvZtu/vEjH/rQ7z1w367d"
    "u3fXarWenp7Jyck8z9/2ttfcddcjs7Oz1Wq1v79/587tr33ta598akccxwcPHnjta1+7d0/j"
    "7rvvfsW5Ly+VShMT+3ft2tXXVz/uuOMs6WazHbXKL/2tNx8Yoy1bthhjVq1atXLp6bffvHn9"
    "+vX3bXmac550qtz6mzfOPf7442vWrNl/YGe73Z6emvnQh96zZcvTW7duDcOS0bj11gcqlcrA"
    "YH1+fn5s34Hly4a1LsTwr7meA9YCUp7x8pcjCDkTnregSurZicsuuaT4k3TlL3fKMrDHHnus"
    "ed11AyG3GQyBOV5us9HRUX7iicWqsCAgrQUQuEGe57t2jZ1yyimc8zDEa17zmp/85Cdvectr"
    "JicnX/ayl7mue/PND4yPj4+Ojo6MjMzOzp533nmO49x114NRFK1bt85a2+l0jDFRFEVRdPrp"
    "pwVBMDExsXHjRiFEGIb1uhMEQavVajabQoi+vvKxxx67YcOGJEkvu+yys846fsuWLfv371+5"
    "cmUcx91ud+fOnVLKFStWHDyYzc3NSSmHhobGxsbe8IbXVavViYnGxMREqVQ6+eSTb7vtwSRJ"
    "+vr67rnnnr6+vnXr1kWRlfI3YQ+Sabo8Uoqw7rT4nz5z0/CKLCl5ChAgNM+5/hb83vvRmAZr"
    "z6TdHC4cL4r1fnhjYEojtOgnDGjj/2Rj/qYLy23FmCUG6WBn1T500tLFf/Nx+H6CkletCIK1"
    "IIdZWKNyB+599z50wvHre4cWPbGj+dgTjzGyY2PT4+PjURStX7/+wIEDJ5544po1a/bs2XPG"
    "GWfMzc3Fcfzkk0+uXbt2dHR0YmJizZo1cRxv376diDqd7u7du++44w7O+djY2IEDBwCsWrUo"
    "jmPP86pVp9PJN23a9MY3vvHxxx8fGhp6+ulmf3//5s2btdabNm2ampqam5u77777pJSXXXbZ"
    "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"
    "1ddXg8X4PisFb7WScjnodOeV6Q4M1gaHqsIBWctEYZqKp3cd9Hw5ONifZYnjOMaQ4I4QyHOU"
    "ygDQ7kTVagiuo263FNSLQlXhAMB8o+H75YnxeclLvluuVdFsgguUK/A8yCIRPsukWwIh7aDT"
    "UYWCUKk4e/ftW3P08snJGQD1eh1AuxVxt1T4V3zf5RyuB88HEbiwxhhrweBohSyFYAhDEEej"
    "EVcrYZLAcxEEaDZRxNuFJMZzY4wlzRiTwhVCcC6fXV/7yU9xDiIRtaMoSmCJsQKGRjz11FN3"
    "3HlnFEVJxm65ecPtdzy0b99crTb4zW9+a+vWnd1utmzZkhtvvMUYGh7uYwwbNjx8ww03GEO9"
    "fQM33XTTvffes2rVUZzJu+666+GfbRsZPua++x4aHh554omte/fuGx4e/NnDD9Tr1UWL63me"
    "3XzzzbfeevPU1NSKZWsffPBn7XaTCNdcc9U999wDsDVrlt9y8915ni9e1KcUtm3f2um0+gd6"
    "Xdf9py9dMrx4Rb0egGFs374f/ehHq1YdxZl39VXXtltqdja/8cZbN256fHJybnKy+djjj69Z"
    "Pbx58+and+6ZmWo9+MDG++67P8uy5cuX/+xnD4+N7a339t50000PPPBAlmU9PT2+H95w0y33"
    "3XdfHMeLFw/v3bv3h9f+8ODBg+vWHbV125Yrr7yyXK5wLv/py1/bsePpwYEVt912/+o1K++5"
    "555du/bdeOMtmzc/1Whk11573ZYt29asGQ1D33G5tRaMAj8QQhIRY/x5/kQGz+OVetWv+Cnj"
    "sXGs6I9V36f//vvHHffGW26a2L3D/e63Hz5+zeuvumzjk9vamzc2Aveo71+2YWw3brnhiWt+"
    "8GDShc5w8T9euXT49EcenLn8kgc2PthZt/oNf/b+r15zxeY7bxnbs9M8eP/ea666y/dw2Xd/"
    "9OPr787S8h23bhtZtFLFcJl39fc3Le7/rS99/jqV4HuXPHrptx+uBstuuO7po1e9/l++8ZOZ"
    "g/jh1Q99+eKr8gxS4IrL79f5MlLOow+1Hnt04rpr7ku7yLu45cc7H32w+cTG9re+fm27hfsf"
    "eEg4Ymjx0J69Yyec8OJvfOPS/fuye+/ufOEf7iZz3I+ue+qqqzadeupbv/jFH87NsRtu3Hbt"
    "tZs57//BVQ+ec+7v/vPXrpye0z39/m23blt/wgWXfffup56MP/LnXz76qN+++sonbr9l6qKP"
    "XtFbffk/fvbWxx7Nu+2hwYGTevtqH7voC1dc8vDV39u0bvXZD/1071ErTxvf2zLKX3fMqb5b"
    "FQyw3BG+5GWyEuDPz0fkRa0e5yiXvd7e3p6eHinlAryVtSeffMy5556bpinn/Dvf+U6r1UrT"
    "9ODBg1dcccX5559/6613Dg8P33PPPQUc+5ve9KYf/OAHW7du1Vqfd955Z565JE3TJEle85rX"
    "vO99bzrjjBV5nv/sZ2MDAwNaa2PMzMxMEMBx0O2it7f32muvPeecc7Zu1VmWua779NNxHMef"
    "+9znzj///M2bJ8MwjOP4qaeSIsWrUDovvfTSZcuWPfroo0W2+YYNGwYGBjZu3Dg3N/eud73r"
    "D/7gD44/fulLX/rS3t7enp7S8uXLTz/99Jtuumnp0qWtVouIent7jzmmdPLJJ+/f39qyZcvg"
    "4OBPfrJp+fLlRx89tH79+v7+/nYbruseffSSU045pdls9vX1veIVS1796lc3Gg0Ab3/7iy68"
    "8MJOp3PPPfdcf/31GzceOPvss59++unt27cPDeGEE04YHR2t1+t333331Vdfnec/T/nlfKGa"
    "4Pn5iRwsJygwK1301N3efq9Wd/2S5jIaXdP7hYs/d8n3vnT8+uH5zs7jTlhc6ckrPTjzZcde"
    "8LqXbHz8rkc23TU0HJz2W2vv3rDVDXD3hutHVw9a1li6ovL1f/nshz78ifUnr1yzdtE/fOF/"
    "vPf9H9j25B4vTO578MajjhlYPlr7wTXfIj7/l3/1uZtveySsIsom/v4fLvqrj7/rjruveOX5"
    "J/cv4j+68X8tHgmu+uG/XPq9r9xy+xWjR/WPHtX/6GN3JTkcL/nilz75qb/9Sjc+OLy0Uqra"
    "nbuntu6YJt5esapv155Nxxy75M8/+p4LL3p/J47jbIrJbt8gmp3xE04a2rHz/vWnLF804tZ6"
    "zdiBjX/3D1958umHnt736EvPftGadYMPPnzb5PSTn/67z+58eqMb5NU6uNP5p/958U/uve6Y"
    "YxfX+/lf/tWXv/2di9esHVq6ovoH7/741775WYjWytW9y0d76v3csvmTTh2t9zPhoRNPCDdq"
    "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"
    "AAAASUVORK5CYII=")
NAMEMODULE = "RemitosDePedidos"
LIST_STYLE = TableStyle(
[('ALIGN', (0,1), (-1,-1), 'LEFT')
,('BOX',(0,0),(-1,-1),1,black),
('BACKGROUND',(0,0),(3,0),yellow),
('GRID',(0,1),(-1,-1),1,black),
('FONTSIZE',(0,1),(-1,-1),7),
('BOTTOMPADDING',(0,1),(-1,-1),1),
('TOPPADDING',(0,1),(-1,-1),1),
('LEFTPADDING',(0,1),(-1,-1),1)])
REMITO_ORIGINAL = 1
REMITO_COPIA = 2
class RemitosDePedidos(canvas.Canvas):
    def __init__(self,DatosOrigen = None
                 ,DatosRemito = None
                 ,DatosDestino = None
                 ,Data = None
                 ,NroCopias = 2
                 ,NroOriginal = 1):
        self.__ErrorDescripcion = ""
        self.__NroError = 0
        self.__NameClase = "RemitosDePedidos"
        self.__Metodo = "__init__"
        self.__nombre = ""
        for i in range(1,15):
            self.__nombre = self.__nombre + random.choice("abcdefghijklmnopqrstuvwxyz1234567890")
        directorio = os.path.join(os.getcwd(),"Temp")
        ruta = os.path.join(os.getcwd(),"Temp" , self.__nombre + ".pdf")
        if not os.path.isdir(directorio):
            os.mkdir(directorio)
        self.__ruta = ruta
#        print self.__ruta
        canvas.Canvas.__init__(self,self.__ruta 
                               ,pagesize = A4 )
        self.__DatosOrigen = DatosOrigen
        self.__DatosRemito = DatosRemito
        self.__DatosDestinos = DatosDestino
        self.__Data = Data
        self.__NroCopias = NroCopias
        self.__NroOriginal = NroOriginal
        if self.__CrearOriginal()== True:
            pass
        else:
            raise Exception , self.GetError()
        
        if self.__CrearCopias()== True:
            pass
        else:
            raise Exception , self.GetError()
        
        self.save()

    def __CrearOriginal(self):
        try:
            self.__SetError()
            self.__Metodo = "__CrearOriginal"
            for i in range(self.__NroOriginal):
                if self.__CrearFormatoPrincipal()== True:
                    pass
                else:
                    raise Exception , self.GetError()
                if self.__CompletarDatosOrigen()== True:
                    pass
                else:
                    raise Exception , self.GetError()
                if self.__CompletarDatosRemito()== True:
                    pass
                else:
                    raise exception , self.GetError()
                
                if self.__CompletarDatosDestino()== True:
                    pass
                else:
                    raise Exception , self.GetError()
                if self.__CompletarDatosRecibo()== True:
                    pass
                else:
                    raise Exception , self.GetError()
                
                if self.__CompletarDatosTransportista()== True:
                    pass
                else:
                    raise Exception , self.GetError()
                
                if self.__CompletarInformacionAdicional()== True:
                    pass
                else:
                    raise Exception , self.GetError()
                
                if self.__CreateTable()== True:
                    pass
                else:
                    raise Exception ,self.GetError()
            
                self.showPage()
            return True
        except:
            error = sys.exc_info()[:2]
            self.__MensajeError(error)
            return False
    def __CrearCopias(self):
        try:
            self.__SetError()
            self.__Metodo = "__CrearCopias"
            for i in range(self.__NroCopias):
                if self.__CrearFormatoPrincipal()== True:
                    pass
                else:
                    raise Exception , self.GetError()
                if self.__CompletarDatosOrigen()== True:
                    pass
                else:
                    raise Exception , self.GetError()
                if self.__CompletarDatosRemito(REMITO_COPIA)== True:
                    pass
                else:
                    raise exception , self.GetError()
                
                if self.__CompletarDatosDestino()== True:
                    pass
                else:
                    raise Exception , self.GetError()
                if self.__CompletarDatosRecibo()== True:
                    pass
                else:
                    raise Exception , self.GetError()
                
                if self.__CompletarDatosTransportista()== True:
                    pass
                else:
                    raise Exception , self.GetError()
                
                if self.__CompletarInformacionAdicional()== True:
                    pass
                else:
                    raise Exception , self.GetError()
                
                if self.__CreateTable()== True:
                    pass
                else:
                    raise Exception ,self.GetError()
            
                self.showPage()
                
            return True
        except:
            error = sys.exc_info()[:2]
            self.__MensajeError(error)
            return False
    def __CrearFormatoPrincipal(self):
        try:
            self.__SetError()
            self.__Metodo = "__CrearFormatoPrincipal"
            self.roundRect(x = 1*cm, y = 27.2*cm, width = 13.8*cm, height = 2*cm, radius = 10 , stroke=1, fill=0)
            self.roundRect(x = 14.9*cm, y = 27.2*cm, width = 4.3*cm, height = 2*cm, radius = 10 , stroke=1, fill=0)
            self.roundRect(x = 1*cm, y = 25.0*cm, width = 18.2*cm, height = 2*cm, radius = 10 , stroke=1, fill=0)
            self.roundRect(x = 1*cm, y = 10.7*cm, width = 18.2*cm, height = 14.1*cm, radius = 10 , stroke=1, fill=0)
            self.roundRect(x = 1*cm, y = 8.5*cm, width = 18.2*cm, height = 2*cm, radius = 10 , stroke=1, fill=0)
            self.roundRect(x = 1*cm, y = 4.25*cm, width = 18.2*cm, height = 4*cm, radius = 10 , stroke=1, fill=0)
            self.rect(x = 1*cm, y = 1*cm, width = 18.2*cm, height = 3*cm, stroke=1, fill=0)
            image = os.getcwd()+ "/osplad.jpg"
            self.drawImage(image,x = 1.5*cm, y = 27.3*cm, width=3*cm,height=1.7*cm)
            return True
        except:
            error = sys.exc_info()[:2]
            self.__MensajeError(error)
            return False
        
    def __CompletarDatosOrigen(self):
        try:
            self.__SetError()
            self.__Metodo = "__CompletarDatosOrigen"
            self.setFont("Times-Roman", 7)
            self.drawString(5*cm,28.95*cm,"Despachante: ")
            self.drawString(6.7*cm,28.95*cm,self.__DatosOrigen["Despachante"])
            self.drawString(5*cm,28.70*cm,"Origen: ")
            self.drawString(6.7*cm,28.70*cm,self.__DatosOrigen["Origen"])
            self.drawString(5*cm,28.45*cm,"Direccion: ")
            self.drawString(6.7*cm,28.45*cm,self.__DatosOrigen["Direccion"])
            self.drawString(5*cm,28.2*cm,"Localidad: ")
            self.drawString(6.7*cm,28.2*cm,self.__DatosOrigen["Localidad"])
            self.drawString(5*cm,27.95*cm,"Provincia: ")
            self.drawString(6.7*cm,27.95*cm,self.__DatosOrigen["Provincia"])
            self.drawString(5*cm,27.70*cm,"Cod. Postal: ")
            self.drawString(6.7*cm,27.70*cm,self.__DatosOrigen["Cod. Postal"])
            self.drawString(5*cm,27.45*cm,"Telefonos: ")
            self.drawString(6.7*cm,27.45*cm,self.__DatosOrigen["Telefonos"])
            return True
        except:
            error = sys.exc_info()[:2]
            self.__MensajeError(error)
            return False
    def __CompletarDatosRemito(self, Tipo = REMITO_ORIGINAL):
        try:
            self.__SetError()
            self.__Metodo = "__CompletarDatosRemito"
            if Tipo == REMITO_ORIGINAL:
                self.setFillColorRGB(0,0,0)
                self.setFont("Times-Roman", 30)
                self.drawString(18.1*cm,27.3*cm,"O")
            elif Tipo == REMITO_COPIA:
                self.setFillColorRGB(0,0,0)
                self.setFont("Times-Roman", 30)
                self.drawString(18.1*cm,27.3*cm,"C")
            self.setFillColorRGB(0,0,0)
            self.setFont("Times-Roman", 12)
            self.drawString(15.2*cm,28.8*cm,"REMITO DE ENVIO")
            self.setFont("Times-Roman", 8)
            self.drawString(15.5*cm,28.2*cm,"Nro")
            self.drawString(16.3*cm,28.2*cm,self.__DatosRemito["Nro"])
            self.drawString(15.5*cm,27.9*cm,"Fecha")
            self.drawString(16.3*cm,27.9*cm,self.__DatosRemito["Fecha"])
            return True
        except:
            error = sys.exc_info()[:2]
            self.__MensajeError(error)
            return False

    def __CompletarDatosDestino(self):
        try:
            self.__SetError()
            self.__Metodo = "__CompletarDatosDestino"
            self.setFont("Times-Roman", 12)
            self.drawString(1.2*cm,26.6*cm,"DATOS DESTINO")
            self.setFont("Times-Roman", 7)
            self.drawString(5*cm,26.8*cm,"Dependencia: ")
            self.drawString(6.7*cm,26.8*cm,self.__DatosDestinos["Dependencia"])
            self.drawString(5*cm,26.55*cm,"Solicitante: ")
            self.drawString(6.7*cm,26.55*cm,self.__DatosDestinos["Solicitante"])
            self.drawString(5*cm,26.3*cm,"Direccion: ")
            self.drawString(6.7*cm,26.3*cm,self.__DatosDestinos["Direccion"])
            self.drawString(5*cm,26.05*cm,"Localidad: ")
            self.drawString(6.7*cm,26.05*cm,self.__DatosDestinos["Localidad"])
            self.drawString(5*cm,25.8*cm,"Provincia: ")
            self.drawString(6.7*cm,25.8*cm,self.__DatosDestinos["Provincia"])
            self.drawString(5*cm,25.55*cm,"Cod. Postal: ")
            self.drawString(6.7*cm,25.55*cm,self.__DatosDestinos["Cod. Postal"])
            self.drawString(5*cm,25.3*cm,"Telefonos: ")
            self.drawString(6.7*cm,25.3*cm,self.__DatosDestinos["Telefonos"])
            return True
        except:
            error = sys.exc_info()[:2]
            self.__MensajeError(error)
            return False
    def __CompletarDatosRecibo(self):
        try:
            self.__SetError()
            self.__Metodo = "__CompletarDatosRecibo"
            self.setFont("Times-Roman", 12)
            self.drawString(1.2*cm,10*cm,"RECIBI CONFORME: ")
            self.rect(x = 5*cm, y = 8.85*cm, width = 5*cm, height = 0*cm, stroke=1, fill=0)
            self.setFont("Times-Roman", 8)
            self.drawString(6.5*cm,8.6*cm,"Firma y Sello")
            self.rect(x = 12*cm, y = 8.85*cm, width = 5*cm, height = 0*cm, stroke=1, fill=0)
            self.drawString(13.7*cm,8.6*cm,"Aclaracion ")
            return True
        except:
            error = sys.exc_info()[:2]
            self.__MensajeError(error)
            return False
    def __CompletarDatosTransportista(self):
        try:
            self.__SetError()
            self.__Metodo = "__CompletarDatosTransportista"
            self.setFont("Times-Roman", 12)
            self.drawString(1.2*cm,7.8*cm,"DATOS DEL TRANSPORTISTA: ")
            self.setFont("Times-Roman", 8)
            self.drawString(1.2*cm,7.4*cm,"Se envio por: ")
            self.rect(x = 3.7*cm, y = 7.4*cm, width = 7*cm, height = 0*cm, stroke=1, fill=0)
            self.drawString(1.2*cm,7*cm,"Empresa Contratada: ")
            self.rect(x = 3.7*cm, y = 7*cm, width = 7*cm, height = 0*cm, stroke=1, fill=0)
            self.drawString(11*cm,7*cm,"Cuit: ")
            self.rect(x = 11.8*cm, y = 7*cm, width = 3*cm, height = 0*cm, stroke=1, fill=0)
            self.drawString(15*cm,7*cm,"Telefonos: ")
            self.rect(x = 16.5*cm, y = 7*cm, width = 2.5*cm, height = 0*cm, stroke=1, fill=0)
            self.drawString(1.2*cm,6.6*cm,"Lugar De Entrega: ")
            self.rect(x = 3.7*cm, y = 6.6*cm, width = 7*cm, height = 0*cm, stroke=1, fill=0)
            self.drawString(11*cm,6.6*cm,"Fecha Salida: ")
            self.rect(x = 12.8*cm, y = 6.6*cm, width = 2*cm, height = 0*cm, stroke=1, fill=0)
            self.drawString(15*cm,6.6*cm,"Fecha Llegada: ")
            self.rect(x = 17*cm, y = 6.6*cm, width = 2*cm, height = 0*cm, stroke=1, fill=0)
            self.drawString(1.2*cm,6.2*cm,"Observaciones: ")
            self.rect(x = 1.2*cm, y = 5.8*cm, width = 17.7*cm, height = 0*cm, stroke=1, fill=0)
            self.rect(x = 1.2*cm, y = 5.4*cm, width = 17.7*cm, height = 0*cm, stroke=1, fill=0)
            self.rect(x = 1.2*cm, y = 5*cm, width = 17.7*cm, height = 0*cm, stroke=1, fill=0)
            return True
        except:
            error = sys.exc_info()[:2]
            self.__MensajeError(error)
            return False
            
    def __CompletarInformacionAdicional(self):
        try:
            self.__SetError()
            self.__Metodo = "__CompletarInformacionAdicional"
            self.drawString(4.9*cm,3*cm,"Escanear Remito FIRMADO y enviarlos a : ")
            self.drawString(10*cm,3*cm,self.__DatosOrigen["Email"])
            self.drawString(4.9*cm,2.6*cm,"Una vez enviado Comunicarse a los telefonos: ")
            self.drawString(10.5*cm,2.6*cm,self.__DatosOrigen["Telefonos"])
            return True
        except:
            error = sys.exc_info()[:2]
            self.__MensajeError(error)
            return False
    def __CreateTable(self):
        try:
            self.__SetError()
            self.__Metodo = "__CreateTable"
            colWidths = (50,180,245,30)
            self.__CompletarGrilla()
            t = Table(self.__Data,colWidths= colWidths, rowHeights=14, style= LIST_STYLE, splitByRow=1,
                      repeatRows=0, repeatCols=0)
            w, h = t.wrapOn (self, 0.1 * 72,0.1 * 72)
            t.drawOn(self,1.2*cm,11.3*cm)
            return True
        except:
            error = sys.exc_info()[:2]
            self.__MensajeError(error)
            return False
      
    def __CompletarGrilla(self):
        try:
            self.__SetError()
            self.__Metodo = "__CompletarGrilla"
            aux = len(self.__Data)
            total = 24 - aux
            for i in range(aux,27):
                self.__Data.append(["", "", "",""])
            return True
        except:
            error = sys.exc_info()[:2]
            self.__MensajeError(error)
            return False
    def Printer(self):
        try:
            self.__SetError()
            self.__Metodo = "Printer"
            currentprinter = win32print.GetDefaultPrinter()
            directorio = os.path.join(os.getcwd(),"Temp",self.__nombre + ".pdf")
            win32api.ShellExecute(0, "print", directorio, None,  ".",  0)
            return True
        except:
            error = sys.exc_info()[:2]
            self.__MensajeError(error)
            return False
    def View(self):
        try:
            self.__SetError()
            self.__Metodo = "View"
            directorio = os.path.join(os.getcwd(),"Temp",self.__nombre + ".pdf")
            os.startfile(directorio, 'open')
            return True
        except:
            error = sys.exc_info()[:2]
            self.__MensajeError(error)
            raise Exception , "Problema con archivo: " + directorio
    def __SetError(self):
        self.__ErrorDescripcion = ""
        self.__NroError = 0 
    def __MensajeError(self,error):
        self.__ErrorDescripcion = "Modulo_" + str(NAMEMODULE)+ "_Clase_" + str(self.__NameClase)+ "_Metodo_" + str(self.__Metodo)
        self.__ErrorDescripcion = self.__ErrorDescripcion + "\nException: " + string.upper(str(error[0]))+ "\n" + string.upper(str(error[1]))
    def GetError(self):
        return self.__ErrorDescripcion
    
    
